package org.joget.workflow.controller;
import au.com.bytecode.opencsv.CSVWriter;
import org.joget.commons.util.DynamicDataSourceManager;
import org.joget.commons.spring.model.Setting;
import org.joget.commons.util.CsvUtil;
import org.joget.commons.util.LogUtil;
import org.joget.commons.util.SetupManager;
import org.joget.directory.model.service.DirectoryManager;
import org.joget.directory.model.service.DirectoryManagerImpl;
import org.joget.directory.model.service.DirectoryManagerPlugin;
import org.joget.directory.model.service.DirectoryManagerProxyImpl;
import org.joget.plugin.base.Plugin;
import org.joget.plugin.base.PluginManager;
import org.joget.workflow.model.WorkflowFacade;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import org.joget.commons.util.HostManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class SetupWebController {
@Autowired
private SetupManager setupManager;
@Autowired
private PluginManager pluginManager;
@Autowired
@Qualifier("main")
private DirectoryManager directoryManager;
@Autowired
private WorkflowFacade workflowFacade;
@RequestMapping("/settings/setup/list")
public String setupList(ModelMap map) {
Collection<Setting> settingList = setupManager.getSettingList("", null, null, null, null);
Map<String, String> settingMap = new HashMap<String, String>();
for (Setting setting : settingList) {
settingMap.put(setting.getProperty(), setting.getValue());
}
Properties properties = DynamicDataSourceManager.getProperties();
for (Object key : properties.keySet()) {
settingMap.put(key.toString(), properties.getProperty(key.toString()));
}
//get directory manager plugin list
Collection<Plugin> pluginList = pluginManager.list();
Iterator i = pluginList.iterator();
while (i.hasNext()) {
Plugin plugin = (Plugin) i.next();
if (!(plugin instanceof DirectoryManagerPlugin)) {
i.remove();
}
}
// get current directory manager class name
String directoryManagerClassName = directoryManager.getClass().getName();
if (directoryManager instanceof DirectoryManagerProxyImpl) {
directoryManagerClassName = ((DirectoryManagerProxyImpl) directoryManager).getDirectoryManagerImpl().getClass().getName();
}
boolean directoryManagerConfigError = DirectoryManagerImpl.class.getName().equals(directoryManagerClassName);
Locale[] localeList = Locale.getAvailableLocales();
String[] localeStringList = new String[localeList.length];
for (int x = 0; x < localeList.length; x++) {
localeStringList[x] = localeList[x].toString();
}
Arrays.sort(localeStringList);
map.addAttribute("localeList", localeStringList);
map.addAttribute("settingMap", settingMap);
map.addAttribute("profileList", DynamicDataSourceManager.getProfileList());
map.addAttribute("currentProfile", DynamicDataSourceManager.getCurrentProfile());
map.addAttribute("directoryManagerPluginList", pluginList);
map.addAttribute("directoryManagerClassName", directoryManagerClassName);
map.addAttribute("directoryManagerConfigError", directoryManagerConfigError);
return "setup/setupList";
}
@RequestMapping(value = "/settings/setup/profile/change", method = RequestMethod.POST)
public void profileChange(Writer writer, @RequestParam("profileName") String profileName) {
if (!HostManager.isVirtualHostEnabled()) {
DynamicDataSourceManager.changeProfile(profileName);
}
}
@RequestMapping(value = "/settings/setup/profile/create", method = RequestMethod.POST)
public void profileCreate(Writer writer, HttpServletRequest request, @RequestParam("profileName") String profileName) {
if (!HostManager.isVirtualHostEnabled()) {
DynamicDataSourceManager.createProfile(profileName);
DynamicDataSourceManager.changeProfile(profileName);
//request params
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String paramName = (String) e.nextElement();
if (!paramName.equals("profileName")) {
String paramValue = request.getParameter(paramName);
DynamicDataSourceManager.writeProperty(paramName, paramValue);
}
}
}
}
@RequestMapping(value = "/settings/setup/profile/delete", method = RequestMethod.POST)
public void profileDelete(Writer writer, @RequestParam("profileName") String profileName) {
if (!HostManager.isVirtualHostEnabled()) {
DynamicDataSourceManager.deleteProfile(profileName);
}
}
@RequestMapping(value = "/settings/setup/submit", method = RequestMethod.POST)
public String setupSubmit(HttpServletRequest request, ModelMap map) {
boolean deleteProcessOnCompletionIsNull = true;
boolean enableNtlmIsNull = true;
boolean rightToLeftIsNull = true;
//request params
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String paramName = (String) e.nextElement();
String paramValue = request.getParameter(paramName);
if (paramName.equals("deleteProcessOnCompletion")) {
deleteProcessOnCompletionIsNull = false;
paramValue = "true";
}
if (paramName.equals("enableNtlm")) {
enableNtlmIsNull = false;
paramValue = "true";
}
if (paramName.equals("rightToLeft")) {
rightToLeftIsNull = false;
paramValue = "true";
}
Setting setting = setupManager.getSettingByProperty(paramName);
if (setting == null) {
setting = new Setting();
setting.setProperty(paramName);
setting.setValue(paramValue);
} else {
setting.setValue(paramValue);
}
setupManager.saveSetting(setting);
}
if (deleteProcessOnCompletionIsNull) {
Setting setting = setupManager.getSettingByProperty("deleteProcessOnCompletion");
if (setting == null) {
setting = new Setting();
setting.setProperty("deleteProcessOnCompletion");
}
setting.setValue("false");
setupManager.saveSetting(setting);
}
if (enableNtlmIsNull) {
Setting setting = setupManager.getSettingByProperty("enableNtlm");
if (setting == null) {
setting = new Setting();
setting.setProperty("enableNtlm");
}
setting.setValue("false");
setupManager.saveSetting(setting);
}
if (rightToLeftIsNull) {
Setting setting = setupManager.getSettingByProperty("rightToLeft");
if (setting == null) {
setting = new Setting();
setting.setProperty("rightToLeft");
}
setting.setValue("false");
setupManager.saveSetting(setting);
}
pluginManager.refresh();
workflowFacade.updateDeadlineChecker();
return "redirect:/web/settings/setup/list";
}
@RequestMapping(value = "/settings/setup/datasource/submit", method = RequestMethod.POST)
public String setupDatasourceSubmit(HttpServletRequest request, ModelMap map) {
//request params
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String paramName = (String) e.nextElement();
if (!paramName.equals("profileName")) {
String paramValue = request.getParameter(paramName);
DynamicDataSourceManager.writeProperty(paramName, paramValue);
}
}
return "redirect:/web/settings/setup/list?tab=datasourceSetup";
}
@RequestMapping(value = "/settings/setup/directoryManagerImpl/remove", method = RequestMethod.POST)
public void setupDirectoryManagerImplRemove(Writer writer, ModelMap map) {
setupManager.deleteSetting("directoryManagerImpl");
setupManager.deleteSetting("directoryManagerImplProperties");
}
@RequestMapping("/settings/setup/directoryManagerImpl/config")
public String setupDirectoryManagerImplConfig(ModelMap map, @RequestParam("directoryManagerImpl") String directoryManagerImpl) throws IOException {
Plugin plugin = pluginManager.getPlugin(directoryManagerImpl);
Map propertyMap = new HashMap();
String properties = setupManager.getSettingValue("directoryManagerImplProperties");
if (properties != null && properties.trim().length() > 0) {
propertyMap = CsvUtil.getPluginPropertyMap(properties);
}
map.addAttribute("plugin", plugin);
map.addAttribute("propertyMap", propertyMap);
map.addAttribute("directoryManagerImpl", directoryManagerImpl);
return "setup/directoryManagerImplConfig";
}
@RequestMapping(value = "/settings/setup/directoryManagerImpl/config/submit", method = RequestMethod.POST)
public String setupDirectoryManagerImplConfigSubmit(ModelMap map, @RequestParam("directoryManagerImpl") String directoryManagerImpl, HttpServletRequest request) {
//request params
Map<String, String> propertyMap = new HashMap();
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String paramName = (String) e.nextElement();
//ignore the parameter "directoryManagerImpl"
if (!paramName.equals("directoryManagerImpl")) {
String[] paramValue = (String[]) request.getParameterValues(paramName);
propertyMap.put(paramName, CsvUtil.getDeliminatedString(paramValue));
}
}
StringWriter sw = new StringWriter();
try {
CSVWriter writer = new CSVWriter(sw);
Iterator it = propertyMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> pairs = (Map.Entry) it.next();
writer.writeNext(new String[]{pairs.getKey(), pairs.getValue()});
}
writer.close();
} catch (Exception ex) {
LogUtil.error(getClass().getName(), ex, "");
}
//save plugin
Setting setting = setupManager.getSettingByProperty("directoryManagerImpl");
if (setting == null) {
setting = new Setting();
setting.setProperty("directoryManagerImpl");
}
setting.setValue(directoryManagerImpl);
setupManager.saveSetting(setting);
//save plugin properties
Setting propertySetting = setupManager.getSettingByProperty("directoryManagerImplProperties");
if (propertySetting == null) {
propertySetting = new Setting();
propertySetting.setProperty("directoryManagerImplProperties");
}
propertySetting.setValue(sw.toString());
setupManager.saveSetting(propertySetting);
return "setup/directoryManagerImplConfigSuccess";
}
@RequestMapping("/settings/version")
public String setupVersion(ModelMap map) {
return "setup/setupVersion";
}
}